package io.gitee.zicai.bus.adaptor;

import io.gitee.zicai.bus.bus.IBus;

import java.io.Serializable;
import java.util.function.Consumer;

/**
 * IBusAdaptor
 *
 * @author zicai
 * @since 2021-01-22
 */
public interface IBusAdaptor<S, B extends IBus<S, T>, T> extends Serializable {

    /**
     * 厂商的服务
     *
     * @param brandName 厂商名称
     * @return IBusReceiver
     */
    S getCmdService(String brandName);

    /**
     * 接收命令
     *
     * @return Consumer
     */
    default Consumer<B> invokeCmd() {
        return bus -> bus.getBiConsumer().accept(this.getCmdService(bus.getBrand()), bus.getPayload());
    }

    /**
     * 接收命令，如果有异常，则执行 {@link #onException(IBus, Exception)} 方法
     *
     * @return Consumer
     */
    default Consumer<B> tryInvokeCmd() {
        return bus -> {
            try {
                this.invokeCmd().accept(bus);
            } catch (Exception e) {
                e.printStackTrace();
                this.onException(bus, e);
            }
        };
    }

    default void onException(B bus, Exception e) {
        // 处理数据异常时，在这里处理
    }
}
